<?php

/*
 * Абстрактный класс адаптера источника данных для моделей
 */

namespace T4\MODEL;

abstract class AAdapter {

    /**
     * Ссылка на класс модели, которая вызывает адаптер
     * @var string Имя класса модели
     */
    protected $modelClass;

    /**
     * Ссылка на объект-модель с данными
     * @var \T4\Model Объект-модель 
     */
    protected $model;

    /**
     * Конструктор, создает объект адаптера
     * @param string $modelClass Имя класса модели, которая хочет использовать адаптер
     */
    final public function __construct($modelClass) {

        if ( !class_exists($modelClass, true) )
            throw new Exception('Адаптер' . get_called_class() . ' не обнаружил модель ' . $modelClass);

        $this->modelClass = $modelClass;
        
    }

    /**
     * Для использования динамических методов, требуется передать адаптеру объект модели, содержащий данные
     * @param \T4\Model $model Объект модели
     */
    final public function setModel($model) {

        if (!$model instanceof $this->modelClass)
            throw new Exception('Адаптеру' . get_called_class() . ' передана модель не подходящего класса ');

        $this->model = $model;
    }

    /**
     * Метод, получающий от модели ее схему
     * @return array Схема модели
     */
    final protected function getSchema() {
        $class = $this->modelClass;
        return $class::getSchema();
    }

    /**
     * Метод, получающий от модели имя ее таблицы
     * @return type Имя таблицы
     */
    final public function getTable() {
        $class = $this->modelClass;
        return $class::getTable();
    }

    abstract public function getColumnType($column);

    abstract public function install();

    abstract public function uninstall();
    
    abstract public function query($query);

    abstract public function findAll($order=null);

    abstract public function findByField($field, $value, $where=null, $order=null, $limit=null);

    abstract public function findOne($where=null, $order=null);

    abstract public function findOneByField($field, $value, $where=null, $order=null);

    abstract public function insert();

    abstract public function update();

    abstract public function delete();
}